function requestData(url) {
    return  new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve(url)
        },2000)
    })
}
// 回调地狱
// requestData("coderwhy").then(res=>{
//     requestData(res+"aaa").then(res=>{
//         requestData(res+"bbbb").then(res=>{
//             console.log(res)
//         })
//     })
// })

//优化：promise中的then的返回值解决
// requestData("why").then(res=>{
//     return requestData(res+"aaa")
// }).then(res1=>{
//     return requestData(res1+"bbbb")
// }).then(res2=>{
//     console.log(res2)
// })

// 方案三：promise+generator
// function* getData(){
//    const res1 =  yield requestData("why")
//    const res2 =  yield requestData(res1+"aaaaa")
//    const res3 =  yield requestData(res2+"bbbbb")
//    console.log(res3)
// }

// const generator = getData()
// 手动执行
// generator.next().value.then(res=>{
//     generator.next(res).value.then(res=>{
//         generator.next(res).value.then(res=>{
//             generator.next(res)
//         })
//     })
// })

// function execGenerator(genFn){
//     const generator = genFn()

//     function exec(res){
//         const result = generator.next(res)
//         if(result.done) {return result.value}
//         result.value.then(res=>{
//             exec(res)
//         })
//     }

//     exec()
// }

// execGenerator(getData)

// 方案四 co库
// const co = require('co')

// co(getData)

// 方案五 async/await
async function getData(){
   const res1 =  await requestData("why")
   const res2 =  await requestData(res1+"aaaaa")
   const res3 =  await requestData(res2+"bbbbb")
   console.log(res3)
}

getData()
